2005-08-28
Analoges Aufnehmen - HOWTO

Hier wird ein nötiges Basiswissen erklärt wie man unter Linux mit mencoder
analoge Videos mit guter Qualität aufnehmen kann.

1. Einrichten von saa7134:

hotplug müsste eigentlich alles automatisch erkennen und die Module richtig laden.
Hier eine Liste der benötigten Module:
saa7134
video_buf
tuner

Optionen für saa7134 werden mit modinfo saa7134 erklärt. Mit oss=1 kann man den Ton
direkt als oss-device registrieren lassen. Da ich alsa verwende, musste ich mit dem
mitgelieferten Kabel zum Line-In der Soundkarte gehen.

root:/etc/modprobe.d# vi SAA7134
alias char-major-81     videodev
options saa7134         gbuffers=32

gbuffers habe ich auf das maximum gesetzt.

2. Ton richtig einschalten

Folgende Schalter müssen bei kmix gesetzt sein:

Line, Capture: roter Kreis, Lautstärke nicht zu hoch
Line-In As Surround: Disable

Will man stattessen lieber mit dem Microphon aufnehmen, dann:
Mic: roter Kreis, mit dem grünen Kreis kann man mithören


3. aufnehmen mit ffmpeg
 Das FFmpeg-Projekt ist das wohl wichtigste Codecprojekt für Linux und
 Unixartige Betriebssysteme. Es besteht aus den Teilen

ffmpeg
ffserver
ffplay
libavcodec
libavformat

 Mit dem Konsolentool ffmpeg lassen sich verschiedene Videoformate
 in ein anderes konvertieren, sogar die direkte Aufnahme von einer
 TV-Karte ist möglich. Um beispielsweise die DivX-Datei mit einer
 Auflösung von 720x512 und 25 fps direkt von der TV-Karte /dev/video0
 aufzunehmen verwendet man folgenden Aufruf:

        $ ffmpeg -vd /dev/video0 -b 720 -r 25 -s 720x512 -t 15 video.avi


 ffmpeg bestimmt anhand der Dateiendung der Ausgabedatei ein Format,
 bei AVI-Dateien standardmäßig MPEG4. Das Format läßt sich über den
 Schalter -f  ändern, eine Liste der gültigen Formate erfährt
 man durch

        $ ffmpeg -formats


 ffserver ist ein Multimedia-Streamserver für HTTP, ffplay ein einfacher
 Videoplayer auf der Basis von SDL.


5. JTVD

jtvd ist ein Programm welches einfaches Aufnehmen von Videos verspricht.
Das Programm ist in Java geschrieben. Die Qualtiät war mir unzureichend,
darum habe ich die einstellbaren Parameter in jtvd getuned und dann den
mencoder Befehl weiter verwendet.

Ausgangsbasis: diesen Mencoder Command habe ich von JTVD:
# JTVD command:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=8:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vqscale=2 -oac mp3lame -lameopts q=2:mode=1 -o test3.avi

es recht gut funktioniert, bis auf die Auflösung, Interlacing, Qualität und Breite.

-force-avi-aspect ist für das Seitenverhältnis zuständig: 4/3 oder 16/9
-tv string setzt die video4linux parameter
input setzt dabei die Videoquelle, aber dafür am besten jtvd verwenden!
0..television
1..composite1 (recommended)
2..s-video
3..composite2
freq setzt dabei die Frequenz
203,25..ORF1
224,25..ORF2

Die beste Bitrate konnte ich dadurch auf meinen System bestimmen:

Best Bitrate:
# JTVD command:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o /var/rip/jtvd/files/bitrate4000.avi

6. Einführung Seitenverhältnisse

"16:9 heißt, wie der Begriff schon verdeutlicht, daß sich Breite zu Höhe wie 16 zu 9
verhalten. Bei 768 Breite wären das 432 Höhe und bei 405 Höhe wären das 720 Breite."

"Aaaaaber - genau bei letzterem Zahlenverhältnis befände sich Dein Lehrer auf dem Holzweg denn PAL-DV (darauf will er wahrscheinlich hinaus), normalerweise mit 720*576 aufgelöst, hat bei 16:9 trotzdem nicht 720*405 sondern 720*432 Pixel! Das kommt daher daß DV bei der Wiedergabe in der Breite um den Faktor 1,0667 gestreckt wird, in der Höhe aber unverändert bleibt. Die NICHTQUADARTISCHEN PIXEL des DV-Formates werden also bei der Wiedergabe gestreckt um eine 4:3 PAL-Anzeige zu realisieren. Wenn die DV-Pixel quadratisch WÄREN (sind sie aber nicht!) dann käme man rein rechnerisch auf den Wert von 405. Da es aber KEINE quadratischen Pixel sind, muß auch da die richtige Antwort 432 lauten. Eine Auflösung von 720*405 ist definitiv falsch, kommt in der Praxis nicht vor und kann mit vielen Codecs überhaupt nicht generiert werden weil sie eine durch 8 oder teilbare Auflösung erwarten."

"Anamorph kodiertes Breitbild hat eine PAL-Auflösung von 720*576 Bildpunkten vor und 1024*576 Bildpunkte nach der Entzerrung."

"Since you can use lavc for encoding both video and audio (-ovc lavc -oac lavc), you can pass options for both in the same configuration line in -lavcopts or in your mencoder config file."


7. Konfiguration von mencoder

In ~/.mplayer/mencoder kann man Optionen angeben, die dann von mencoder verwendet werden. Ich habe
hier nur die xvidencopts angegeben:

File: ~/.mplayer/mencoder
xvidencopts=fixed_quant=3:vhq=4:chroma_opt=1:hq_ac=1:interlacing=1:bvhq=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=6:quant_type=mpeg:gmc=1:max_overflow_improvement=15


8. audio codec (mp3)

"mp3lame - cbr/abr/vbr MP3 using libmp3lame

My default recommendation, encodes the audio using the MP3 format.
If you're feeling adventurous, man mencoder and search for lameopts
to see how to change VBR, ABR, etc.

mencoder movie.wmv -o movie.avi -ovc lavc -oac mp3lame

audio codec (mp2) - faster and little bigger

If no options are passed in -lavcopts, then lavc will encode the
audio to mp2.

Use the acodec argument with lavcopts to change the audio codec.


This example will encode the audio stream to mp3, using the ffmpeg libraries.

mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc -lavcopts acodec=mp3


Author's Note: As a matter of opinion, using mp2 instead of mp3 is a
reasonable price to pay for a faster encoding. From my experience, the
size difference is not an issue."

Ich habe entgegen dieser Entscheidung mp3 verwendet. Das bringt dann die
zusätzlichen Parameter: -oac mp3lame -lameopts cbr:br=192:mode=1

-oac entscheided über das Programm
-lameopts gibt Paramter für lame, bei mir war die Bitrate 192 optimal


9. Suche beste mencoder Befehl:
Ausgang:
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o lavc.avi

Versuche XviD zu verwenden:

mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc xvid -xvidencopts fixed_quant=3:vhq=0:chroma_opt=1:hq_ac=1:interlacing=1:max_iquant=5:max_pquant=5:max_bquant=5:me_quality=2:quant_type=mpeg:gmc=1:max_overflow_improvement=15 -oac mp3lame -lameopts cbr:br=192:mode=1 -o xvid.avi

me_quality und vhq so hoch stellen, dass der Prozessor noch mitkommt (nicht nur 5 fps o.ä.)

(bringt nichts sichtbares und belastet cpu viel mehr)

-------------- vorletzte Version 16/9 (mit interlacing problem) -------------------
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 16-9.avi
-------------- vorletzte Version 4/3 (mit interlacing problem)-------------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=4/3:vbitrate=4000 -oac mp3lame -lameopts cbr:br=192:mode=1 -o 4-3.avi
-------------- vorletzte Version -------------------


10. Kurze Videos erzeugen.
Da es viel einfacher ist Videos zusammenzufügen (avimerge -o name -i file ...; bei transcode dabei) als sie
auseinanderzukriegen (avidemux) habe ich versucht beim Auslesen der Videokamera möglichst kurze Sequenzen
zu erzeugen, die man dann im Notfall immer noch zusammengeben kann!
Dieses Skript einfach ausführen und mit Strg+C immer an geeigneten Szenenwechseln veranlassen eine neue
Datei zu generieren. Die erzeugten Dateien heißen einfach der Reihe nach 1.avi -> 2.avi -> ...
Bei längeren Stückerln kann man dann den Namen in Ordnung bringen.

for i in `seq -w 01 99`
do
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
mv current.avi "$i.avi"
done


11. Interlacing Problem

Von "Matthias Wieser":
"Sicher? Der obige Bildausschnitt sieht so aus, wie wenn du zusätzlich den
pp=lb Deinterlacer verwendet hättest.
Unabhängig davon, du kannst nicht erwarten, dass man nach einer
verlustbehafteten Kompression anschließend noch sauber alle ungeraden
Bildzeilen von den geraden trennen kann. Also: Entweder bei der Aufnahme
deinterlacen, oder interlaced aufzeichnen und erst im Abspielprogramm
Deinterlacing anschalten. Für letzteres gibt es zwei Mencoder Optionen,
die dies anschalten. Die eine ist "ildct", die andere musst du selbst in
der man-page nachschlagen."

mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf crop=650:540:30:20 -vf hqdn3d -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi

"Ach ja, wenn du statt "-vf hqdn3d" "-vf denoise3d" (oder gar lavcopts
nr=400) verwendest, bleibt auch noch genügend Rechenzeit für Mplayers
Deinterlacinf-Filter übrig. Empfehlenswert sind (pp=lb, pp=l5, pp=fd
oder -vf kerndeint). Besser ist es aber wohl, nichts am Video zu
verändern, sondern gleich interlaced (s.o.) aufzuzeichnen. Die
Deinterlacer vom Mplayer sind alle nicht so gut.
Du solltest auch die schwarzen Ränder vom Video abschneiden, würden
Fernseher eh machen. Das verringert den CPU-Bedarf und verbessert die
Komprimierbarkeit. z.B.: -vf  crop=672:544:24:16"


12. XviD

 XviD ist also ein open-source MPEG4-Codec, der hochqualitative Ergebnisse
 liefert. Er unterstüzt Features wie mehrere B-Frames, Quarter pixel motion
 compensation, Global motion compensation, Lumi masking, Trellis
 Quantisierung, sowie H.263, MPEG und eigene Quantisierungsmatrizen.


-------------- letzte Version (16/9 - s-video) -------------------
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- letzte Version (4/3 - composite) -----------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=1:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:548:24:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- letzte Version (4/3 - TV) --------------------------
mencoder -force-avi-aspect 4/3 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=0:freq=203,25:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=714:548:0:14 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=4/3:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
-------------- Schleife mit s-video (Übertragung von Videofilmen) ----------
for i in `seq -w 01 99`
do
mencoder -force-avi-aspect 16/9 -tv driver=v4l2:device=/dev/video0:alsa:adevice=hw.0,0:input=2:normid=0:amode=1:width=720:height=576:fps=25.0:brightness=0:contrast=0:hue=0:saturation=0 tv:// -vf-add crop=672:544:24:16 -vf-add hqdn3d -vf-add kerndeint -ovc lavc -lavcopts vcodec=xvid:aspect=16/9:vbitrate=4000:ildct -oac mp3lame -lameopts cbr:br=192:mode=1 -o current.avi
mv current.avi "$i.avi"
done
-------------- letzte Version -------------------------------------

Diese Tipps haben mich dann zu den letzendlichen mencoder Befehl geführt.
Achtung! Da hier xvid verwendet werden, ist auch die obige xvid Konfiguration
von Bedeutung.

Erklärung der Paramter:
-vf-add: Um eine Filterkette aufzubauen, benötigt man -vf-add. Dieser Filter werden dann alle hintereinander
ausgeführt.
crop: dieser Filter schneidet den schwarzen Rand weg
kerndeint: kümmert sich um das interlacing
vcodec=xvid: Ganz wichtig, erst dadurch wird der wesentlich bessere xvid codec aktivert


{Referenzen}
http://gentoo-wiki.com/HOWTO_Mencoder_Introduction_Guide
http://www.linuxforen.de/forums/showthread.php?t=88454
http://mplayerhq.hu/DOCS/HTML/de/encoding.html
Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif